package utils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 封装数学相关计算
 *
 **/
public class MathUtil {

    public static BigDecimal devide(BigDecimal d1, BigDecimal d2, int scale) {
        return d1.divide(d2, scale, BigDecimal.ROUND_HALF_UP);
    }

    public static BigDecimal multiply(BigDecimal m1, BigDecimal m2) {
        return m1.multiply(m2);
    }

    public static BigDecimal multiply(BigDecimal m1, BigDecimal m2, int scale) {
        m1 = m1.setScale(scale, BigDecimal.ROUND_HALF_UP);
        return m1.multiply(m2).setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    public static BigDecimal zero() {
        return new BigDecimal("0.00");
    }

    public static BigDecimal null2Zero(BigDecimal target) {
        return target == null ? zero() : target;
    }

    /**
     * 组合数组中元素的sum==目标值
     * @param keys
     * @param kill
     * @return 数组索引组合
     * @return
     */
    public static List<Integer> groupIndex(int[] keys, int kill) {
        int n = keys.length;
        int nbit = 1 << n;
        double in;
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < nbit; i++) {
            in = 0;
            list.clear();
            for (int j = 0; j < n; j++) {
                //由0到n右移位
                int tmp = 1 << j;
                //与运算，同为1时才会是1
                if ((tmp & i) != 0) {
                    in += keys[j];
                    list.add(j);
                }
            }
            if (in == kill) {
                return list;
            }
        }
        return list;
    }

    public static int null2Zero(Integer source) {
        return source == null ? 0 : source;
    }

    public static String percent(BigDecimal source, BigDecimal total) {
        if (total == null || total.compareTo(new BigDecimal(0)) == 0) {
            return "0";
        }
        BigDecimal target = source.divide(total, 4, BigDecimal.ROUND_HALF_UP);
        BigDecimal oneHundred = new BigDecimal("100");
        return target.multiply(oneHundred).setScale(2).toString() + "%";
    }

    public static BigDecimal subtract(BigDecimal source, BigDecimal target) {
        int dividend = source.multiply(new BigDecimal("100")).toBigInteger().intValue();
        int divisor = target.multiply(new BigDecimal("100")).toBigInteger().intValue();
        return new BigDecimal(dividend - divisor).divide(new BigDecimal(100));
    }

    public static BigDecimal add(BigDecimal source, BigDecimal target) {
        int o1 = source.multiply(new BigDecimal("100")).toBigInteger().intValue();
        int o2 = target.multiply(new BigDecimal("100")).toBigInteger().intValue();
        return new BigDecimal(o1 + o2).divide(new BigDecimal(100));
    }

    public static boolean greaterThanZero(BigDecimal value) {
        return value != null && value.compareTo(BigDecimal.ZERO) > 0;
    }

}
